package cn.kgc.mes.workorder.service.impl;

import cn.kgc.mes.storage.domain.MaterialStock;
import cn.kgc.mes.storage.service.IMaterialStockService;
import cn.kgc.mes.workorder.domain.MdProductBom;
import cn.kgc.mes.workorder.mapper.MdProductBomMapper;
import cn.kgc.mes.workorder.service.IMdProductBomService;
import cn.kgc.mes.workorder.service.IProWorkorderService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Service
public class MdProductBomServiceImpl extends ServiceImpl<MdProductBomMapper, MdProductBom> implements IMdProductBomService {
    @Autowired
    private IMaterialStockService materialStockService;
    @Override
    public List<MdProductBom> selectBomById(Integer productId) {
        LambdaQueryWrapper<MdProductBom> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(MdProductBom::getItemId, productId);
        //因为现在就是service层了，所以不需要像在controller中一样，先注入Servicel了,直接调用MybatisPlus的list方法
        List<MdProductBom> list  = list(queryWrapper);
        // 从MdProductBom集合中提取所有需要查询的ID，减少数据库查询次数
        List<Long> bomItemIds = list.stream()
                .map(MdProductBom::getBomItemId)
                .collect(Collectors.toList());
        // 一次性查询所有库存信息，避免循环查询
        LambdaQueryWrapper<MaterialStock> stockQuery = new LambdaQueryWrapper<>();
        stockQuery.in(MaterialStock::getItemId, bomItemIds)
                .select(MaterialStock::getItemId, MaterialStock::getQuantityOnhand);
        List<MaterialStock> stocks = materialStockService.list(stockQuery);
        // 将库存信息转换为Map，便于快速查找
        Map<Long, BigDecimal> stockMap = stocks.stream()
                .collect(Collectors.toMap(
                        MaterialStock::getItemId,
                        MaterialStock::getQuantityOnhand,
                        (k1, k2) -> k1 // 处理可能的重复ID，当流中出现相同的 key（即两个MaterialStock对象的itemId相同）时，该函数用于指定保留哪个值。
                ));
        // 填充库存信息
        list.forEach(bom -> {
            bom.setQuantityOnhand(stockMap.getOrDefault(bom.getBomItemId(), BigDecimal.ZERO));
        });
        return list;
    }
}
